#include<bits/stdc++.h>
using namespace std;
#define ln node<<1
#define rn node<<1|1
#define mid (l+r>>1)
bool st;
const int N=1e6+99;
int n,q,ans,vis[N];
string str;
int spre[N],sbac[N];
int sta[N],stacnt;
vector<int> to[N],Q[N];
struct tree{
	int mn,tag;
	tree(){ tag=0; }
}tr[(1<<22)+99];
void pushup(int node){
	tr[node].mn=min(tr[ln].mn,tr[rn].mn);
	return;
}
void pushdown(int node){
	if(tr[node].tag){
		tr[ln].mn+=tr[node].tag; tr[ln].tag+=tr[node].tag;
		tr[rn].mn+=tr[node].tag; tr[rn].tag+=tr[node].tag;
		tr[node].tag=0;
	}
	return;
}
void build(int node,int l,int r){
	if(l==r){ tr[node].mn=sbac[l]; return; }
	build(ln,l,mid); build(rn,mid+1,r);
	pushup(node);
	return;
}
int query(int node,int l,int r,int tarl,int tarr){
	if(tarl<=l&&r<=tarr) return tr[node].mn;
	pushdown(node);
	if(tarr<=mid) return query(ln,l,mid,tarl,tarr);
	if(tarl>mid) return query(rn,mid+1,r,tarl,tarr);
	return min(query(ln,l,mid,tarl,tarr),query(rn,mid+1,r,tarl,tarr));
}
void add(int node,int l,int r,int tarl,int tarr,int val){
	if(tarl<=l&&r<=tarr){ tr[node].mn+=val; tr[node].tag+=val; return; }
	pushdown(node);
	if(tarl<=mid) add(ln,l,mid,tarl,tarr,val);
	if(tarr>mid) add(rn,mid+1,r,tarl,tarr,val);
	pushup(node);
	return;
}
int bit[N];
void add(int x,int val){
	while(x<N){
		bit[x]+=val;
		x+=(x&(-x));
	}
	return;
}
int que(int x){
	int re=0;
	while(x){
		re+=bit[x];
		x-=(x&(-x));
	}
	return re;
}
void solve(int u){
	if(u==n+1){
		for(int v:to[u])
			solve(v);
	}
	else{
		vis[u]=1;
		int l=u+1,res=0;
		for(int r:Q[u]){
			res=que(r)+max(query(1,0,n+1,r+1,r+1)-query(1,0,n+1,l,r)+vis[r+1],0);
//			if(vis[r+1]) cerr<<111<<endl;
			ans^=res;
//			cout<<l<<" "<<r<<" "<<res<<endl;
//			cout<<que(r)<<" "<<query(1,0,n+1,r,r)<<" "<<query(1,0,n+1,l,r)<<endl<<endl;
		}
		if(u==0) return;
		add(u,1);
		add(1,0,n+1,0,u-1,1);
		for(int v:to[u]){
//			cout<<u<<" "<<v<<endl;
			solve(v);
		}
		add(u,-1);
		add(1,0,n+1,0,u-1,-1);
		vis[u]=0;
	}
	return;
}
bool ed;
int main(){
	freopen("good.in","r",stdin);
	freopen("good.out","w",stdout);
	std::ios::sync_with_stdio(false);
	cin.tie(0);
	cin>>n>>q>>str;
	str=" "+str;
	for(int i=1;i<=n;i++)
		spre[i]=spre[i-1]+(str[i]=='0'?-1:1);
	for(int i=n;i>=0;i--)
		sbac[i]=sbac[i+1]+(str[i]=='0'?-1:1);
	for(int i=0;i<=n;i++){
		while(stacnt&&spre[sta[stacnt]]>spre[i]){
			to[i].push_back(sta[stacnt]);
			stacnt--;
		}
		sta[++stacnt]=i;
	}
	while(stacnt){
		to[n+1].push_back(sta[stacnt]);
		stacnt--;
	}
	build(1,0,n+1);
	int l,r;
	while(q--){
		cin>>l>>r;
		Q[l-1].push_back(r);
	}
	solve(n+1);
	cout<<ans;
//	cerr<<fixed<<setprecision(3)<<endl<<(double)clock()/CLOCKS_PER_SEC<<endl;
	return 0;
}